Skip to content

使用 .NET Framework 將資訊寫入 Windows 事件記錄檔

TLDR

  • 使用 System.Diagnostics.EventLog 類別可將應用程式訊息寫入 Windows 事件檢視器。
  • 必須先檢查 Source 是否存在,若不存在則需使用 EventLog.CreateEventSource 進行建立。
  • SourceLogName 具有一對一關聯,一個 Source 只能對應一個 LogName
  • 若需變更 Source 對應的 LogName,必須刪除舊來源並建立新來源,且必須重新開機變更才會生效。
  • 新增自訂記錄檔後,需重新開啟「事件檢視器」才能在介面上看到該記錄檔。

EventLog 核心概念

在 .NET Framework 中,System.Diagnostics.EventLog 是處理 Windows 事件記錄檔的主要類別。開發時需注意以下兩個參數:

  • Source (來源):標示應用程式名稱。寫入前應先使用 EventLog.SourceExists(source) 檢查,若不存在則需呼叫 EventLog.CreateEventSource(source, logName) 建立。
  • LogName (記錄檔名稱):指定事件寫入的記錄檔分類。同一個 Source 只能與單一 LogName 建立關聯。

eventlog source property

eventlog logname property

寫入事件記錄檔

什麼情況下會遇到這個問題:當應用程式需要將執行狀態或錯誤訊息寫入系統日誌以便後續監控時。

基本寫入範例

csharp
string source = "MySource";

// 檢核 Source 是否存在,不存在就建立 Source
if (!EventLog.SourceExists(source)) {
    // LogName 可以寫 Application 或 應用程式
    EventLog.CreateEventSource(source, "Application");
}

// 寫入訊息
EventLog.WriteEntry(source, "MyMessage");

// 另一種寫法
using (EventLog log = new EventLog()) {
    log.Source = source;
    log.WriteEntry("MyMessage");
}

執行結果: event viewer application log

TIP

WriteEntry() 方法支援 EventLogEntryTypeEventID 參數,可用於定義事件等級(如 Error, Warning, Information)及事件識別碼。

自訂記錄檔名稱

若需將事件寫入自訂的記錄檔,可將 LogName 指定為特定名稱。

csharp
string source = "MySource2";

if (!EventLog.SourceExists(source)) {
    EventLog.CreateEventSource(source, "MyLogName");
}

EventLog.WriteEntry(source, "MyMessage");

執行結果: event viewer custom log

WARNING

建立新的記錄檔後,必須重新開啟「事件檢視器」才能在介面上看到該記錄檔。

變更 Source 與 LogName 的關聯

什麼情況下會遇到這個問題:當需要將既有的應用程式來源重新導向至不同的記錄檔分類時。

若要更改 Source 所綁定的 LogName,必須先刪除舊的 Source 再重新建立。

csharp
string source = "MySource";
string logName = "MyLogName";

if (EventLog.SourceExists(source)) {
    string oldLogName = EventLog.LogNameFromSourceName(source, ".");
    if (oldLogName != logName) {
        EventLog.DeleteEventSource(source);
        EventLog.CreateEventSource(source, logName);
    }
} else {
    EventLog.CreateEventSource(source, logName);
}

EventLog.WriteEntry(source, "MyMessage");

WARNING

根據 MSDN 文件說明,若來源已經對應到記錄檔,重新對應後必須重新開機電腦,變更才會生效。否則訊息仍會寫入舊的記錄檔中。

刪除記錄檔

若需移除不再使用的記錄檔,可使用以下方法:

csharp
EventLog.Delete(logName);

參考資料

MSDN EventLog 類別

異動歷程

    • 初版文件建立。